Annotation-based configuration 基于注解的配置

[试验] @EnableActiviti注解相对较新,未来可能会有变更。

除了基于 XML 的配置以外,还可以选择基于注解的方式来配置 Spring 环境。 这与使用 XML 的方法非常相似,除了要使用 @Bean 注解, 而且配置是使用 java 编写的。 它已经可以直接用于 Activiti-Spring 的集成了:

首先介绍(需要 Spring 3.0+ )的是 @EnableActiviti 注解。 最简单的用法如下所示:

  1. @Configuration
  2. @EnableActiviti
  3. public static class SimplestConfiguration {
  4. }

它会创建一个 Spring 环境,并对 Activiti 流程引擎进行如下配置

  • 默认的内存 H2 数据库,启用数据库自动升级。
  • 一个简单的 DataSourceTransactionManager
  • 一个默认的 SpringJobExecutor
  • 自动扫描 processes/ 目录下的 bpmn20.xml 文件。

在这样一个环境里,可以直接通过注入操作 Activiti 引擎:

  1. @Autowired
  2. private ProcessEngine processEngine;
  3. @Autowired
  4. private RuntimeService runtimeService;
  5. @Autowired
  6. private TaskService taskService;
  7. @Autowired
  8. private HistoryService historyService;
  9. @Autowired
  10. private RepositoryService repositoryService;
  11. @Autowired
  12. private ManagementService managementService;
  13. @Autowired
  14. private FormService formService;

当然,默认值都可以自定义。比如,如果配置了 DataSource,它就会代替默认创建的数据库配置。 事务管理器,job 执行器和其他组件都与之相同。 比如如下配置:

  1. @Configuration
  2. @EnableActiviti
  3. public static class Config {
  4. @Bean
  5. public DataSource dataSource() {
  6. BasicDataSource basicDataSource = new BasicDataSource();
  7. basicDataSource.setUsername("sa");
  8. basicDataSource.setUrl("jdbc:h2:mem:anotherDatabase");
  9. basicDataSource.setDefaultAutoCommit(false);
  10. basicDataSource.setDriverClassName(org.h2.Driver.class.getName());
  11. basicDataSource.setPassword("");
  12. return basicDataSource;
  13. }
  14. }

其他数据库会代替默认的。下面介绍了更加复杂的配置。注意AbstractActivitiConfigurer 用法, 它暴露了流程引擎的
配置,可以用来对它的细节进行详细的配置。

  1. @Configuration
  2. @EnableActiviti
  3. @EnableTransactionManagement(proxyTargetClass = true)
  4. class JPAConfiguration {
  5. @Bean
  6. public OpenJpaVendorAdapter openJpaVendorAdapter() {
  7. OpenJpaVendorAdapter openJpaVendorAdapter = new OpenJpaVendorAdapter();
  8. openJpaVendorAdapter.setDatabasePlatform(H2Dictionary.class.getName());
  9. return openJpaVendorAdapter;
  10. }
  11. @Bean
  12. public DataSource dataSource() {
  13. BasicDataSource basicDataSource = new BasicDataSource();
  14. basicDataSource.setUsername("sa");
  15. basicDataSource.setUrl("jdbc:h2:mem:activiti");
  16. basicDataSource.setDefaultAutoCommit(false);
  17. basicDataSource.setDriverClassName(org.h2.Driver.class.getName());
  18. basicDataSource.setPassword("");
  19. return basicDataSource;
  20. }
  21. @Bean
  22. public LocalContainerEntityManagerFactoryBean entityManagerFactoryBean(
  23. OpenJpaVendorAdapter openJpaVendorAdapter, DataSource ds) {
  24. LocalContainerEntityManagerFactoryBean emf = new LocalContainerEntityManagerFactoryBean();
  25. emf.setPersistenceXmlLocation("classpath:/org/activiti/spring/test/jpa/custom-persistence.xml");
  26. emf.setJpaVendorAdapter(openJpaVendorAdapter);
  27. emf.setDataSource(ds);
  28. return emf;
  29. }
  30. @Bean
  31. public PlatformTransactionManager jpaTransactionManager(
  32. EntityManagerFactory entityManagerFactory) {
  33. return new JpaTransactionManager(entityManagerFactory);
  34. }
  35. @Bean
  36. public AbstractActivitiConfigurer abstractActivitiConfigurer(
  37. final EntityManagerFactory emf,
  38. final PlatformTransactionManager transactionManager) {
  39. return new AbstractActivitiConfigurer() {
  40. @Override
  41. public void postProcessSpringProcessEngineConfiguration(SpringProcessEngineConfiguration engine) {
  42. engine.setTransactionManager(transactionManager);
  43. engine.setJpaEntityManagerFactory(emf);
  44. engine.setJpaHandleTransaction(false);
  45. engine.setJobExecutorActivate(false);
  46. engine.setJpaCloseEntityManager(false);
  47. engine.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);
  48. }
  49. };
  50. }
  51. // A random bean
  52. @Bean
  53. public LoanRequestBean loanRequestBean() {
  54. return new LoanRequestBean();
  55. }
  56. }